package com.ithuangyl.dimens_creator;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;

public class DimenFactory {

    private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
    private static final String XML_RESOURCE_START = "<resources>\r\n";
    private static final String XML_RESOURCE_END = "</resources>\r\n";
    private static final String XML_DIMEN_TEMPLATE = "\t<dimen name=\"dp_%1$d\">%2$.2fdp</dimen>\r\n";
    private static final String XML_SP_DIMEN_TEMPLATE = "\t<dimen name=\"sp_%1$d\">%2$.2fsp</dimen>\r\n";
    /**
     * 我们的这个适配方案叫最小宽度适配，把屏幕的分成与设计图宽度大小相同的份数，比如设计图上的宽度是375px，就把屏幕的宽度分成375份
     * 这样就在写布局时就无需计算，直接取dimen文件中与设计上对应数值就可以了，但是如果某个控件的高度是写死的且比375大比如1024px这时仅仅
     * 生成375份的话，就不能够精准的表现了。虽然可以生成的尺寸份数多些，但是多多少又不知道，太多会影响到apk大小，后续遇到可以单独添加一条。
     * 可以在这句代码List<Integer> dimenList = DimenUtils.getDimenItems(designWidth);方法中添加参数比如我要添加1024就可以写成这样：
     * List<Integer> dimenList = DimenUtils.getDimenItems(designWidth，1024);依次在后面添加想要生成的数字
     */

    //字体大小区间去6-48一般够用了
    private static final int MIN_FONT_SIZE = 6;
    private static final int MAX_FONT_SIZE = 48;

    /**
     * 生成的文件名
     */
    private static final String XML_NAME = "dimens.xml";

    public static void sop(Object object) {
        System.out.println(object.toString());
    }

    static void makeAllDimen(int designWidth,String dir) {
        List<Integer> dimenList = DimenUtils.getDimenItems(designWidth,1,1024);
        SizeTypes[] sizeTypes = SizeTypes.values();
        int length = sizeTypes.length;
        StringBuilder sb;
        for (int i = 0; i < length; i++) {
            sb = new StringBuilder();
            final SizeTypes type = sizeTypes[i];
            int smallWidth = type.getSmallWidth();
            sb.append(XML_HEADER);
            sb.append(XML_RESOURCE_START);
            int count = dimenList.size();
            for (int j = 0; j < count; j++) {
                float dpValue = px2dip((float) dimenList.get(j), smallWidth, designWidth);
                sb.append(String.format(XML_DIMEN_TEMPLATE, dimenList.get(j), dpValue));
            }

            for (int k = MIN_FONT_SIZE;k<=MAX_FONT_SIZE;k++){
                float dpValue = px2dip((float) k, smallWidth, designWidth);
                sb.append(String.format(XML_SP_DIMEN_TEMPLATE, k, dpValue));
            }

            sb.append(XML_RESOURCE_END);
            makeFile(type, dir, sb.toString());
        }
    }

    private static float px2dip(float pxValue, int sw, int designWidth) {
        float dpValue = (pxValue / (float) designWidth) * sw;
        BigDecimal bigDecimal = new BigDecimal(dpValue);
        return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
    }


    /**
     * 生成的目标文件夹
     * 只需传宽进来就行
     *
     * @param type     枚举类型
     * @param buildDir 生成的目标文件夹
     */
    private static void makeFile(SizeTypes type, String buildDir, String content) {
        try {
            //生成规则
            final String folderName;
            if (type.getSmallWidth() > 0) {
                //适配Android 3.2+
                folderName = "values-sw" + type.getSmallWidth() + "dp";
            } else {
                return;
            }
            //在values目录生成默认的尺寸文件，防止匹配不到对应尺寸的文件报错
            if (type.getSmallWidth() == 360) {
                File defaultFile = new File(buildDir + File.separator + "values");
                if (!defaultFile.exists()) {
                    defaultFile.mkdirs();
                }
                FileOutputStream defaultFos = new FileOutputStream(defaultFile.getAbsolutePath() + File.separator + XML_NAME);
                defaultFos.write(content.getBytes());
                defaultFos.flush();
                defaultFos.close();
            }

            //生成目标目录
            File file = new File(buildDir + File.separator + folderName);
            if (!file.exists()) {
                file.mkdirs();
            }

            //生成values文件
            FileOutputStream fos = new FileOutputStream(file.getAbsolutePath() + File.separator + XML_NAME);
            fos.write(content.getBytes());
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
